home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_400 / 423_01 / accpost / custom.asm < prev    next >
Encoding:
Assembly Source File  |  1989-08-31  |  5.2 KB  |  299 lines

  1. ; customization program
  2.  
  3. ; ID bytes
  4.  
  5. ID0    =    017H
  6. ID1    =    0FDH
  7. ID2    =    046H
  8. ID3    =    00FH
  9. ID4    =    074H
  10. ID5    =    0B3H
  11.  
  12. ; ASCII control characters
  13.  
  14. CR    =    13
  15. LF    =    10
  16. TAB    =     9
  17. SPACE    =    32
  18.  
  19. ; working storage
  20.  
  21. X0            EQU    BYTE PTR [BP]
  22. X1            EQU    BYTE PTR [BP+1]
  23. X2            EQU    BYTE PTR [BP+2]
  24. X3            EQU    BYTE PTR [BP+3]
  25. X4            EQU    BYTE PTR [BP+4]
  26. X5            EQU    BYTE PTR [BP+5]
  27. FILE_NOT_CUSTOMIZABLE    EQU    BYTE PTR [BP+6]
  28. CHARACTER        EQU    BYTE PTR [BP+7]
  29. CHANGE_FLAG        EQU    BYTE PTR [BP+8]
  30. MS_FILE_POSITION    EQU    WORD PTR [BP+10]
  31. LS_FILE_POSITION    EQU    WORD PTR [BP+12]
  32. PARAMETER        EQU    WORD PTR [BP+14]
  33. OLD_PARAMETER        EQU    WORD PTR [BP+16]
  34. LINE_BUFFER_LENGTH    EQU    BYTE PTR [BP+18]
  35. DEFAULT_STRING_LENGTH    EQU    BYTE PTR [BP+19]
  36. LINE_BUFFER        EQU    BYTE PTR [BP+20]
  37. END_LINE_BUFFER        EQU    BYTE PTR [BP+25]
  38.  
  39. HANDLE            EQU    BX
  40. BUFFER_SIZE        EQU    CX
  41. BUFFER            EQU    DX
  42.  
  43.  
  44. CODE    SEGMENT
  45.     ASSUME    CS:CODE, DS:CODE
  46.  
  47.     ORG    100H
  48. BEGIN    PROC    NEAR
  49.  
  50.     MOV    BX,128        ; find command line argument
  51.     CLD
  52. LOOP1:    INC    BX
  53.     CMP    BYTE PTR [BX],SPACE
  54.     JE    LOOP1
  55.     CMP    BYTE PTR [BX],TAB
  56.     JE    LOOP1
  57.     CMP    BYTE PTR [BX],CR
  58.     JNE    OUT1
  59.     CALL    ERROR_EXIT
  60.     DB    'File specifications missing', CR, LF, '$'
  61. OUT1:    MOV    DX,BX
  62. LOOP2:    INC    BX        ; supply terminating zero
  63.     CMP    BYTE PTR [BX],SPACE
  64.     JE    OUT2
  65.     CMP    BYTE PTR [BX],TAB
  66.     JE    OUT2
  67.     CMP    BYTE PTR [BX],CR
  68.     JNE    LOOP2
  69. OUT2:    MOV    BYTE PTR [BX],0
  70.     MOV    AX,3D02H    ; open file to read and write
  71.     INT    21H
  72.     JNC    OPENED
  73.     CALL    ERROR_EXIT
  74.     DB    'File not found or read/write access denied', CR, LF, '$'
  75. OPENED:    MOV    BP,OFFSET ID_BUFFER    ; reserve space for variables
  76.     MOV    BUFFER,OFFSET ID_BUFFER+26
  77.     MOV    BUFFER_SIZE,SP
  78.     SUB    BUFFER_SIZE,OFFSET ID_BUFFER+26+256
  79.     JBE    ISM
  80.     CMP    BUFFER_SIZE,1024        ; refuse to work with buffer
  81.     JAE    OPEN2                ; smaller than 1K
  82. ISM:    CALL    ERROR_EXIT
  83.     DB    'Insufficient memory', CR, LF, '$'
  84. OPEN2:    MOV    HANDLE,AX
  85.     MOV    FILE_NOT_CUSTOMIZABLE,1
  86.     MOV    LS_FILE_POSITION,0
  87.     MOV    MS_FILE_POSITION,0
  88.  
  89. LOOP3:    SUB    SI,SI        ; look for an id block
  90.     SUB    DI,DI
  91.     MOV    X0,0
  92. LOOP4:    CMP    X0,ID0        ; check for id block
  93.     JNE    ENTER4
  94.     CMP    X1,ID1
  95.     JNE    ENTER4
  96.     CMP    X2,ID2
  97.     JNE    ENTER4
  98.     CMP    X3,ID3
  99.     JNE    ENTER4
  100.     CMP    X4,ID4
  101.     JNE    ENTER4
  102.     CMP    X5,ID5
  103.     JNE    ENTER4
  104.     JMP    OUT4        ; found
  105. ENTER4:    MOV    AL,X1        ; circulate X0,X1,X2,X3,X4,X5
  106.     MOV    X0,AL
  107.     MOV    AL,X2
  108.     MOV    X1,AL
  109.     MOV    AL,X3
  110.     MOV    X2,AL
  111.     MOV    AL,X4
  112.     MOV    X3,AL
  113.     MOV    AL,X5
  114.     MOV    X4,AL
  115.     CMP    SI,DI        ; any chars in buffer?
  116.     JB    SKPRD        ; if so, skip read
  117.     MOV    AH,3FH
  118.     INT    21H
  119.     JNC    READOK
  120.     CALL    ERROR_EXIT
  121.     DB    'File read error', CR, LF, '$'
  122. READOK:    OR    AX,AX
  123.     JNZ    NOTEOF
  124.     CMP    FILE_NOT_CUSTOMIZABLE,0
  125.     JZ    NOREX
  126.     CALL    ERROR_EXIT
  127.     DB    'File is not customizable', CR, LF, '$'
  128. NOREX:    MOV    DX,OFFSET S4
  129.     JMP    DISPLAY_STRING ; & RET
  130.     
  131. NOTEOF:    MOV    SI,BUFFER
  132.     MOV    DI,SI
  133.     ADD    DI,AX
  134. SKPRD:    CLD
  135.     LODSB
  136.     MOV    X5,AL
  137.     ADD    LS_FILE_POSITION,1
  138.     ADC    MS_FILE_POSITION,0
  139.     JMP    LOOP4
  140.  
  141. OUT4:    PUSH    BUFFER_SIZE
  142.     PUSH    BUFFER
  143.     MOV    FILE_NOT_CUSTOMIZABLE,0    ; back up to end of id block
  144.     CALL    SEEK
  145.  
  146. LOOP5:    MOV    CHANGE_FLAG,0
  147.     MOV    AH,3FH
  148.     MOV    CX,1
  149.     LEA    DX,CHARACTER
  150.     CALL    READ_BLOCK
  151.     CMP    CHARACTER,0    ; first character of prompt
  152.     JNE    LOOP6
  153.     JMP    OUT5        ; end id block
  154. LOOP6:    MOV    DL,CHARACTER
  155.     CALL    DISPLAY_CHARACTER
  156.     LEA    DX,CHARACTER
  157.     CALL    READ_BLOCK
  158.     CMP    CHARACTER,0
  159.     JNE    LOOP6
  160.     LEA    DX,OLD_PARAMETER
  161.     MOV    CX,2
  162.     CALL    READ_BLOCK
  163.     MOV    AX,OLD_PARAMETER
  164.     MOV    LINE_BUFFER_LENGTH,6
  165.     MOV    DEFAULT_STRING_LENGTH,0
  166.     SUB    DX,DX
  167.     PUSH    DX
  168. LOOP7:    SUB    DX,DX
  169.     DIV    WORD PTR TEN
  170.     ADD    DL,'0'
  171.     PUSH    DX
  172.     OR    AX,AX
  173.     JNZ    LOOP7
  174.     MOV    DX,OFFSET S1
  175.     CALL    DISPLAY_STRING
  176.     LEA    DI,LINE_BUFFER
  177. LOOP8:    POP    AX
  178.     OR    AX,AX
  179.     JZ    OUT8
  180.     CLD
  181.     STOSB
  182.     INC    DEFAULT_STRING_LENGTH
  183.     MOV    DL,AL
  184.     CALL    DISPLAY_CHARACTER
  185.     JMP    LOOP8
  186. OUT8:    MOV    AL,CR
  187.     STOSB
  188.     MOV    DX,OFFSET S2
  189.     CALL    DISPLAY_STRING
  190.     MOV    AH,10
  191.     LEA    DX,LINE_BUFFER_LENGTH
  192.     INT    21H
  193.     MOV    DX,OFFSET S3
  194.     CALL    DISPLAY_STRING
  195.     LEA    SI,LINE_BUFFER
  196.     MOV    PARAMETER,0
  197.     CLD
  198. LOOP9:    LODSB
  199.     CMP    AL,CR
  200.     JE    OUT9
  201.     SUB    AL,'0'
  202.     JB    LOOP9
  203.     CMP    AL,9
  204.     JA    LOOP9
  205.     MOV    CHANGE_FLAG,1
  206.     SUB    AH,AH
  207.     PUSH    AX
  208.     MOV    AX,10
  209.     MUL    PARAMETER
  210.     POP    PARAMETER
  211.     ADD    PARAMETER,AX
  212.     JMP    LOOP9
  213. OUT9:    CMP    CHANGE_FLAG,0
  214.     JE    NOCH
  215.     MOV    AX,PARAMETER
  216.     CMP    AX,OLD_PARAMETER
  217.     JE    NOCH
  218.     SUB    LS_FILE_POSITION,2
  219.     SBB    MS_FILE_POSITION,0
  220.     CALL    SEEK
  221.     LEA    BUFFER,PARAMETER
  222.     MOV    BUFFER_SIZE,2
  223.     CALL    WRITE_BLOCK
  224. NOCH:    JMP    LOOP5
  225. OUT5:    POP    BUFFER
  226.     POP    BUFFER_SIZE
  227.     JMP    LOOP3
  228. BEGIN    ENDP
  229.  
  230. S1    DB    ' [$'
  231. S2    DB    ']: $'
  232. S3    DB    CR, LF, '$'
  233. S4    DB    'Customization completed', CR, LF, '$'
  234. TEN    DW    10
  235.  
  236. DISPLAY_CHARACTER PROC NEAR
  237.     MOV    AH,2
  238.     INT    21H
  239.     RET
  240. DISPLAY_CHARACTER ENDP
  241.  
  242. DISPLAY_STRING PROC NEAR
  243.     MOV    AH,9
  244.     INT    21H
  245.     RET
  246. DISPLAY_STRING ENDP
  247.  
  248. ERROR_EXIT PROC NEAR
  249.     POP    DX
  250.     CALL    DISPLAY_STRING
  251.     MOV    AX,4C01H
  252.     INT    21H
  253. ERROR_EXIT ENDP
  254.  
  255. READ_BLOCK PROC NEAR
  256.     MOV    AH,3FH
  257.     INT    21H
  258.     JC    RBERR
  259.     CMP    AX,CX
  260.     JNZ    RBERR
  261.     ADD    LS_FILE_POSITION,AX
  262.     ADC    MS_FILE_POSITION+2,0
  263.     RET
  264. RBERR:    CALL    ERROR_EXIT
  265.     DB    'File format or read error', CR, LF, '$'
  266. READ_BLOCK ENDP
  267.  
  268. WRITE_BLOCK PROC NEAR
  269.     MOV    AH,40H
  270.     INT    21H
  271.     JC    WBERR
  272.     CMP    AX,CX
  273.     JNZ    WBERR
  274.     ADD    LS_FILE_POSITION,AX
  275.     ADC    MS_FILE_POSITION+2,0
  276.     RET
  277. WBERR:    CALL    ERROR_EXIT
  278.     DB    'File write error', CR, LF, '$'
  279. WRITE_BLOCK ENDP
  280.  
  281. SEEK    PROC    NEAR
  282.     PUSH    CX
  283.     PUSH    DX
  284.     MOV    CX,MS_FILE_POSITION
  285.     MOV    DX,LS_FILE_POSITION
  286.     MOV    AX,4200H
  287.     INT    21H
  288.     POP    DX
  289.     POP    CX
  290.     RET
  291. SEEK    ENDP
  292.  
  293.     EVEN
  294. ID_BUFFER DB 6 DUP (0)
  295.  
  296. CODE    ENDS
  297.  
  298.     END    BEGIN
  299.